package service

import (
	"e_mall_server/dao/mysql"
	"e_mall_server/models"
	"errors"
	"fmt"
	"go.uber.org/zap"
)

/**
 * @Author: zhaobin
 * @Description TODO
 * @Date: 2022-04-29 19:30
 */

// GetAccessList 获取管理员列表接口
func GetAccessList() ([]models.Access, error) {
	return mysql.GetAccessList()
}

// GetAccessListByRoleId 通过角色id获取所拥有的权限
func GetAccessListByRoleId(id int64) (accessList []models.Access, err error) {
	fmt.Printf("角色id是%d", id)
	// 获取当前角色拥有的权限
	roleAccessList := mysql.GetRoleAccessListByRoleId(id)
	roleAccessMap := make(map[int64]int64)
	for _, v := range roleAccessList {
		roleAccessMap[v.AccessId] = v.RoleId
	}

	// 获取所有显示的权限
	accessList, err = mysql.GetShowAccessList()
	if err != nil {
		return
	}
	fmt.Println(roleAccessMap)
	// 循环遍历所有的权限数据，判断当前权限的id是否在角色权限的Map对象中,如果是的话给当前数据加入checked属性
	for i := 0; i < len(accessList); i++ {
		fmt.Printf("%d,%d", i, accessList[i].Id)
		if _, ok := roleAccessMap[accessList[i].Id]; ok {
			accessList[i].Checked = true
		}
		for j := 0; j < len(accessList[i].AccessItem); j++ {
			if _, ok := roleAccessMap[accessList[i].AccessItem[j].Id]; ok {
				accessList[i].AccessItem[j].Checked = true
			}
		}
	}

	zap.L().Debug("菜单权限列表数据", zap.Any("value", accessList))

	return
}

// AddAccess 添加管理员信息
func AddAccess(Access *models.Access) error {
	return mysql.AddAccess(Access)
}

// UpdateAccess 修改管理员信息
func UpdateAccess(Access *models.Access) int64 {
	return mysql.UpdateAccess(Access)
}

// DeleteAccessById 通过管理员id删除管理员数据
func DeleteAccessById(id int64) (int64, error) {

	// 判断该权限是不是顶级模块
	access := mysql.GetAccessById(id)
	var count int64
	if access.ParentId == 0 { //顶级模块
		accessList := mysql.GetAccessListByParentId(access.Id)
		if len(accessList) > 0 {
			return 0, errors.New("当前模块下面有菜单或者操作，请删除菜单或者操作以后再来删除这个数据")
		} else {
			count = mysql.DeleteAccessById(id)
		}
	} else {
		count = mysql.DeleteAccessById(id)
	}

	return count, nil
}

// GetAccessDetailById 通过权限id获取权限详细信息
func GetAccessDetailById(id int64) (models.Access, error) {
	return mysql.GetAccessDetailById(id)
}
